/**
 * 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:

必须在原数组上操作，不能拷贝额外的数组。
尽量减少操作次数。
 */

const orgTarget = [
    73348, 66106, -85359, 53996, 18849, -6590, -53381, -86613, -41065, 83457, 0,
];
const target = [
    73348, 66106, -85359, 53996, 18849, -6590, -53381, -86613, -41065, 83457, 0,
];

/**
 Do not return anything, modify nums in-place instead.
 */
function moveZeroes(nums: number[]): void {
    // 数组就一个数，无需处理
    if (nums.length < 2) return;
    // 非0数的指针
    let nonZeroPos = 0;
    // 0数的指针
    let zeroPos = 0;
    // 非0数指针超出范围，表示处理完毕
    while (nonZeroPos < nums.length) {
        // 寻找下一个0数的位置，注意！可能有负数
        while (zeroPos < nums.length && nums[zeroPos] !== 0) {
            zeroPos++;
        }
        // 寻找下一个非0数的位置，必须满足该位置在0数位置之后(例如：[1, 0, 1])
        while (nonZeroPos <= zeroPos || nums[nonZeroPos] === 0) {
            nonZeroPos++;
        }
        // 非0数指针超出范围，表示处理完毕，循环中断
        if (nonZeroPos >= nums.length) break;
        // 交换下一个0数与非0数的位置
        let tmp = nums[zeroPos];
        nums[zeroPos] = nums[nonZeroPos];
        nums[nonZeroPos] = tmp;
    }
}

moveZeroes(target);
console.log("orgTarget: %s, target: %s", orgTarget, target);

export { moveZeroes };
